/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.edu.fatec.ads.view;

import br.edu.fatec.ads.classes.Cartao;
import br.edu.fatec.ads.classes.Emprestimo;
import br.edu.fatec.ads.classes.Livro;
import br.edu.fatec.ads.facade.FacadeCartao;
import br.edu.fatec.ads.facade.FacadeEmprestimo;
import br.edu.fatec.ads.facade.FacadeLivro;
import br.edu.fatec.ads.util.FrameUtil;
import com.towel.el.FieldResolver;
import com.towel.el.factory.FieldResolverFactory;
import com.towel.swing.table.ObjectTableModel;
import java.awt.Dimension;
import javax.swing.JTable;
import org.hibernate.HibernateException;

/**
 *
 * @author 8340807
 */
public class FrameAdicionarEmprestimo extends javax.swing.JInternalFrame {

    private Livro livro = null;
    private Emprestimo emprestimo = null;

    /**
     * Creates new form CadastrarEmprestimo
     */
    public FrameAdicionarEmprestimo() {
        initComponents();

        FrameUtil.getInstance().removerBarraTitulo(this);

        this.setVisible(true);
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        lblLivro = new javax.swing.JLabel();
        txtLivro = new javax.swing.JTextField();
        lblCartao = new javax.swing.JLabel();
        txtCodigoCartao = new javax.swing.JTextField();
        scrLivro = new javax.swing.JScrollPane();
        tblLivro = new javax.swing.JTable();
        btnAdicionaLivro = new javax.swing.JButton();
        btnVoltar = new javax.swing.JButton();
        btnSalvar = new javax.swing.JButton();
        btnRecuperarCodigo = new javax.swing.JButton();

        setAlignmentX(0.0F);
        setAlignmentY(0.0F);
        setPreferredSize(new java.awt.Dimension(800, 500));

        lblLivro.setText("Livro:");

        txtLivro.setPreferredSize(new java.awt.Dimension(230, 20));

        lblCartao.setText("Cartão:");

        txtCodigoCartao.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
        txtCodigoCartao.setEnabled(false);
        txtCodigoCartao.setPreferredSize(new java.awt.Dimension(150, 20));

        scrLivro.setAutoscrolls(true);
        scrLivro.setPreferredSize(new java.awt.Dimension(200, 60));

        FieldResolverFactory factoryLivro = new FieldResolverFactory(Livro.class);
        FieldResolver isbn = factoryLivro.createResolver("isbn", "ISBN");
        FieldResolver titulo = factoryLivro.createResolver("titulo", "Título");

        ObjectTableModel<Livro> modelLivro = new ObjectTableModel<Livro>(new FieldResolver[]{ isbn, titulo });
        tblLivro.setModel(modelLivro);
        tblLivro.setGridColor(new java.awt.Color(204, 204, 204));
        tblLivro.setMaximumSize(new java.awt.Dimension(300, 300));
        tblLivro.setPreferredSize(new java.awt.Dimension(300, 0));
        tblLivro.setRowHeight(20);
        tblLivro.getTableHeader().setReorderingAllowed(false);
        tblLivro.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tblLivroMouseClicked(evt);
            }
        });
        scrLivro.setViewportView(tblLivro);

        btnAdicionaLivro.setIcon(new javax.swing.ImageIcon(getClass().getResource("/br/edu/fatec/ads/image/add.png"))); // NOI18N
        btnAdicionaLivro.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAdicionaLivroActionPerformed(evt);
            }
        });

        btnVoltar.setText("Voltar");
        btnVoltar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnVoltarActionPerformed(evt);
            }
        });

        btnSalvar.setText("Salvar");
        btnSalvar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnSalvarActionPerformed(evt);
            }
        });

        btnRecuperarCodigo.setText("Recuperar");
        btnRecuperarCodigo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnRecuperarCodigoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(106, 106, 106)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(lblLivro)
                    .addComponent(lblCartao))
                .addGap(10, 10, 10)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(btnVoltar)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 392, Short.MAX_VALUE)
                        .addComponent(btnSalvar))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(txtLivro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(txtCodigoCartao, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGap(203, 203, 203)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(btnAdicionaLivro)
                            .addComponent(btnRecuperarCodigo)))
                    .addComponent(scrLivro, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 516, Short.MAX_VALUE))
                .addGap(150, 150, 150))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(80, 80, 80)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(lblLivro)
                        .addComponent(txtLivro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(btnAdicionaLivro))
                .addGap(38, 38, 38)
                .addComponent(scrLivro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(20, 20, 20)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(lblCartao)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(txtCodigoCartao, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(btnRecuperarCodigo)))
                .addGap(100, 100, 100)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(btnSalvar)
                    .addComponent(btnVoltar))
                .addContainerGap(102, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void btnSalvarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSalvarActionPerformed
        if(livro == null){
            FrameUtil.getInstance().adicionarMensagemAtencao("Você deve adicionar 1 livro para finalizar o empréstimo! Favor verificar.");
        }else{
            String codigoCartao = txtCodigoCartao.getText();

            if(FrameUtil.getInstance().isInteger(codigoCartao)){
                emprestimo = new Emprestimo();

                emprestimo.setLivro(livro);
                emprestimo.setCartao(new Cartao(Integer.parseInt(codigoCartao)));

                try{
                    FacadeEmprestimo.getInstance().inserir(emprestimo);

                    FrameUtil.getInstance().adicionarMensagemSucesso("Empréstimo realizado com sucesso!");

                    txtCodigoCartao.setText(FrameUtil.BLANK);
                    this.limparTable();
                    this.redimensionarTabelaRemoverLinha(tblLivro);
                }catch(Exception cause){
                    if(cause instanceof Exception){
                        FrameUtil.getInstance().adicionarMensagemErro(cause.getMessage());
                    }else{
                        FrameUtil.getInstance().adicionarMensagemErro("Não foi possível efetuar o empréstimo. Tente novamente.");
                    }

                }
            }
        }
    }//GEN-LAST:event_btnSalvarActionPerformed

    private void btnVoltarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnVoltarActionPerformed
        FrameUtil.getInstance().alterarTituloJanela(this, null);

        this.dispose();
    }//GEN-LAST:event_btnVoltarActionPerformed

    private void btnAdicionaLivroActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAdicionaLivroActionPerformed
        ObjectTableModel<Livro> conteudoTabela = (ObjectTableModel<Livro>) tblLivro.getModel();

        if(conteudoTabela.getRowCount() == 1){
            FrameUtil.getInstance().adicionarMensagemAtencao("Não é possível adicionar + de 1 livro por empréstimo. Favor efetuar a exclusão do registro existente para a adição de um novo");
        }else{
            String codigoTombo = txtLivro.getText();

            if(FrameUtil.getInstance().isInteger(codigoTombo)){
                try{
                    livro = FacadeLivro.getInstance().recuperarLivro(Integer.parseInt(codigoTombo));

                    if(livro.isEmprestado()){
                        throw new HibernateException("O livro em questão encontra-se emprestado. Favor escolher outro livro!");
                    }

                    conteudoTabela.add(livro);

                    this.redimensionarTabelaAdicaoLinha(tblLivro);
                    txtLivro.setText(FrameUtil.BLANK);
                }catch(HibernateException cause){
                    FrameUtil.getInstance().adicionarMensagemErro("Não existe livro com o código de tombo fornecido!");
                }
            }else{
                FrameUtil.getInstance().adicionarMensagemAtencao("São aceitos somente caracteres numéricos no campo de Matrícula!");
            }
        }

    }//GEN-LAST:event_btnAdicionaLivroActionPerformed

    private void tblLivroMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tblLivroMouseClicked
        if(evt.getClickCount() == 2){
         ObjectTableModel<Livro> conteudoTabela = (ObjectTableModel<Livro>) tblLivro.getModel();

            conteudoTabela.remove(tblLivro.getSelectedRow());
            this.redimensionarTabelaRemoverLinha(tblLivro);

            livro = null;
        }
    }//GEN-LAST:event_tblLivroMouseClicked

    private void btnRecuperarCodigoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnRecuperarCodigoActionPerformed
        try{
            int codigoCartao = FacadeCartao.getInstance().recuperarCodigoCartao();

            txtCodigoCartao.setText(String.valueOf(codigoCartao));
        }catch(Exception cause){
            cause.printStackTrace();
            
            FrameUtil.getInstance().adicionarMensagemErro("Erro ao recuperar código do cartão: " + cause.getMessage());
        }
    }//GEN-LAST:event_btnRecuperarCodigoActionPerformed

    private void redimensionarTabelaAdicaoLinha(JTable tabela){
        ((ObjectTableModel) tabela.getModel()).fireTableDataChanged();

        tabela.setPreferredSize(new Dimension(tabela.getSize().width, tabela.getSize().height+20));
        tabela.revalidate();
    }

    private void redimensionarTabelaRemoverLinha(JTable tabela){
        ((ObjectTableModel) tabela.getModel()).fireTableDataChanged();

        tabela.setPreferredSize(new Dimension(tabela.getSize().width, tabela.getSize().height-20));
        tabela.revalidate();
    }

    private void limparTable(){
        ((ObjectTableModel) this.tblLivro.getModel()).clear();
    }


    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAdicionaLivro;
    private javax.swing.JButton btnRecuperarCodigo;
    private javax.swing.JButton btnSalvar;
    private javax.swing.JButton btnVoltar;
    private javax.swing.JLabel lblCartao;
    private javax.swing.JLabel lblLivro;
    private javax.swing.JScrollPane scrLivro;
    private javax.swing.JTable tblLivro;
    private javax.swing.JTextField txtCodigoCartao;
    private javax.swing.JTextField txtLivro;
    // End of variables declaration//GEN-END:variables
}
